import re
 

#一、数量词
#下面是一个示例：使用正则方式找出字符串中的3个单词
string = "python 111java678php"
result1 = re.findall('[a-z]{2,6}',string)
print("\n打印result1:")    
print(result1)          #打印：['python', 'java', 'php']

#此处用到了数量词，即数量词{n,m}，m和n均为非负整数，其中n<=m，用于规定最少匹配n次且最多匹配m次，注意在逗号和两个数之间不能有空格。
#例如，"o{1,3}"将匹配"fooooood"中的前三个o为一组，后三个o为一组，而"o{0,1}"等价于"o?";

#二、正则的贪婪与非贪婪
#分析上例可以发现，本来最少匹配2个字符就已经可以识别字符串了,为什么会返回'Python'而不是'py'呢？因为这涉及到正则中的贪婪与非贪婪概念，
#在默认情况下，Python倾向于贪婪的匹配方式，会尽可能的匹配更多的内容，所以此例中得到了完整的单词。如果我们需要设置非贪婪匹配可以进行如下设置：

#测试非贪婪匹配使用'?',效果同'[a-z]{2}'
result2 = re.findall('[a-z]{2,6}?',string)
print("\n打印result2:")    
print(result2)          #打印：['py', 'th', 'on', 'ja', 'va', 'ph']


#三、更多数量词的使用
#'*':匹配前面的子表达式0次或者无限多次 。例如，zo*能匹配“z”，也能匹配“zo”以及“zoo”。*等价于o{0,}
pythonStr = "pytho0python1pythonn2"
result3 = re.findall('python*',pythonStr)
print("\n打印result3:")    
print(result3)          #打印：['pytho', 'python', 'pythonn']

#'-':匹配前面的子表达式一次或多次(大于等于1次）。例如，“zo+”能匹配“zo”以及“zoo”，但不能匹配“z”。+等价于{1,}。
#示例如下：
result4 = re.findall('python+',pythonStr)
print("\n打印result4:")    
print(result4)          #打印：['python', 'pythonn']

#'?':匹配前面的子表达式零次或一次。例如，“do(es)?”可以匹配“do”或“does”中的“do”。?等价于{0,1}。
#示例如下：
result5 = re.findall('python?',pythonStr)
print("\n打印result5:")    
print(result5)          #打印：['pytho', 'python', 'python']
#注意：如果是一个范围'{}'后使用'?', 此处的'?'就是转化非贪婪情况的使用，而非数量词的使用
result6 = re.findall('python{1,2}?',pythonStr)
print("\n打印result6:")    
print(result6)          #打印：['python', 'python']

